# -*- coding: utf-8 -*-
#### 晒单数据统计处理 ####
# 依赖于 pandas 库
# 作者：Ekaros
# 版本：1.2
# 2025.01.22 v1.0 初始版本(shaidan, shaidan_xifen)
# 2025.01.23 v1.1 增加了 insert_shaidan_data_to_mongodb 函数，用于插入分解好的晒单信息到数据库
# 2025.01.24 v1.2 增加了 shaidan_table 函数，将数据库中的数据转换为表格并保存为表格文件
import re
from Tools import mongod_func
import pandas as pd
from datetime import datetime

# 处理字符串，去除非中文、英文、数字的字符
def split_plus(text):
    # 定义一个空列表，用于存储分割后的字符串
    result = []
    # 定义一个空字符串，用于存储当前正在处理的字符串
    result = re.split('[^\u4e00-\u9fa5a-zA-Z0-9]', text)
    return result

# 分解晒单信息(细分业务类型)
# 输入：msg:str  晒单信息
def shaidan_xifen(msg:str):
    dict_list = ['战队', '业务', '号码', '发展人', '是否完美一单', '时间', '原信息']
    msg_sd = dict.fromkeys(dict_list, '否')
    msg_list = msg.split('\n')
    for i in range(len(dict_list) - 3):
        if i > 0:
            if ':' in msg_list[i]:
                if i == 1:
                    split_by = msg_list[i].split(':')[1]
                    msg_sd_list = split_plus(split_by)
                    msg_sd_list = [item for item in msg_sd_list if item not in ("", None)]
                    msg_sort_list = sorted(msg_sd_list[1:], reverse=True)
                    msg_sd[dict_list[i]] = [msg_sd_list[0]] + msg_sort_list
                else:
                    msg_sd[dict_list[i]] = msg_list[i].split(':')[1]
            elif '：' in msg_list[i]:
                msg_sd[dict_list[i]] = msg_list[i].split('：')[1]
        else:
            msg_sd[dict_list[i]] = msg_list[i]
    if '完美一单' in msg:
        msg_sd['是否完美一单'] = '是'
    current_time = datetime.now()
    msg_sd['时间'] = current_time.strftime('%Y-%m-%d')
    msg_sd['原信息'] = msg
    return msg_sd


# 分解晒单信息(不细分业务类型)
# 输入：msg:str  晒单信息
def shaidan(msg:str):
    dict_list = ['战队', '业务', '号码', '发展人', '是否完美一单', '时间', '原信息']
    msg_sd = dict.fromkeys(dict_list, '否')
    msg_list = msg.split('\n')
    for i in range(len(dict_list) - 3):
        if i > 0:
            if ':' in msg_list[i]:
                msg_sd[dict_list[i]] = msg_list[i].split(':')[1]
            elif '：' in msg_list[i]:
                msg_sd[dict_list[i]] = msg_list[i].split('：')[1]
        else:
            msg_sd[dict_list[i]] = msg_list[i]
    if '完美一单' in msg:
        msg_sd['是否完美一单'] = '是'
    current_time = datetime.now()
    msg_sd['时间'] = current_time.strftime('%Y-%m-%d')
    msg_sd['原信息'] = msg
    return msg_sd

# 将分解后的信息插入数据库
# 输入：msg:dict  晒单信息
def insert_shaidan_data_to_mongodb(msg:dict, mongo_url: str ='mongodb://localhost:27017/', database_name: str = 'RPA', collection_name: str ='shaidan_shuju'):
    msg_sd = shaidan_xifen(msg=msg)
    mongod_func.insert_data_to_mongodb(mongo_url=mongo_url, database_name=database_name, collection_name=collection_name, data=msg_sd)


# 读取数据库中的晒单信息并统计成表格保存
# 输入：msg:dict 晒单信息列表
def shaidan_table(mongo_url: str = 'mongodb://localhost:27017/', database_name: str = 'RPA', collection_name: str = 'shaidan_shuju', target:str = datetime.now().strftime('%Y-%m-%d')):
    data = mongod_func.get_shaidan_data_from_mongodb(mongo_url=mongo_url, database_name=database_name, collection_name=collection_name, target_date=target)
    
    max_len = max(len(d['业务']) for d in data)

    columns = ['队伍名称', '发展业务', '客户号码', '发展人', '新入网', '宽带', '终端', '触点', '金虎开户', '是否完美一单', '开单时间']
    rows = []
    for item in data:
        # 每个队伍的业务数量可能不同，因此需要根据最大数量填充空值
        yw = '、'.join(item['业务'])
        row = [item['战队'], yw, item['号码'], item['发展人']]
        changjing_flag = ['新入网', '宽带', '终端', '触点', '金虎开户']
        for flag in changjing_flag:
            if flag in item['业务']:
                row.append('已办理')
            else:
                row.append('')
        row.append(item['是否完美一单'])
        row.append(item['时间'])
        rows.append(row)

    df = pd.DataFrame(rows, columns=columns)
    with pd.ExcelWriter('D:/file/统计/{}_晒单数据统计.xlsx'.format(target), engine='xlsxwriter') as writer:
        df.to_excel(writer, index = False, sheet_name = '当日统计')
        
        # 获取workbook和worksheet对象
        workbook = writer.book
        worksheet = writer.sheets['当日统计']

        # 设置列宽和对齐方式
        format_align = workbook.add_format({'align': 'center',
                                            'valign': 'vcenter'})
        widths = [20, 80, 10, 10, 10, 10, 10, 10, 10, 20, 15]
        for col, width in zip(columns, widths):
            col_idx = columns.index(col)
            worksheet.set_column(col_idx, col_idx, width, format_align)

if __name__ == '__main__':
    test_msg = ['大姚直销战队\n🌹完美一单:新入网+宽带+机顶盒+视频彩铃+移动APP+10分满意+和彩云\n客户号码:8089\n发展人:毛丽梅',
                '姚安直销战队\n🌹完美一单:+++💙🖤➕➕➕宽带➕机顶盒❌视频彩铃+移动APP💙10分满意💕和彩云💟💟💟☮️☮️💘💞💞💕💞💞💕\n客户号码:8089\n发展人:毛丽梅',
                '南华直销战队\n🌹完美一单:宽带+机顶盒+视频彩铃+移动APP+10分满意+和彩云\n客户号码:8089\n发展人:毛丽梅',]
    for i in test_msg:
        insert_shaidan_data_to_mongodb(msg=i)
    shaidan_table()